/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aqu.controlador.Contabilidad;

import aqu.bean.generico.BeanGenerico;
import aqu.persistencia.Dao.Contabilidad.*;
import aqu.persistencia.entity.*;
import aqu.persistencia.utilidad.MessagesController;
import aqu.persistencia.utilidad.Reportes;
import com.icesoft.faces.component.ext.RowSelectorEvent;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import javax.persistence.Cache;

/**
 *
 * @author AQU
 */
@ManagedBean(name = "contabilidadTransController")
@ViewScoped
public class ContabilidadTransController extends BeanGenerico {

    private ConCabeceracontable cabeceraContable;
    private ConDetallecontable detalleContable;    
    private List<ConDetallecontable> listaDetalleAux;
    private List<ConDetallecontable> listaDetalle;
    private List<ConCabeceracontable> listaCabecera;
    private List<ConTipoAsiento> listaTipoAsiento;
    private List<ConEstadoCabecera> listaEstadoAsiento;
    private List<ConLugarAplicacion> listaLugarAplicacion;
    private List<ConCuenta> listaCuenta;
    private ConCabeceracontableManager ConCabeceracontableManager = new ConCabeceracontableManager();
    private ConTipoAsientoManager ConTipoAsientoManager = new ConTipoAsientoManager();
    private ConDetallecontableManager ConDetallecontableManager = new ConDetallecontableManager();
    private ConEstadoCabeceraManager ConEstadoCabeceraManager = new ConEstadoCabeceraManager();
    private ConLugarAplicacionManager ConLugarAplicacionManager = new ConLugarAplicacionManager();
    private ConCuentaManager ConCuentaManager = new ConCuentaManager();
    private boolean panelvisible;
    private ConTipoAsiento tipoAsientoDefault = new ConTipoAsiento(MessagesController.obtenervariable("var_tipo_asien_default"));
    private Date FecInicio;
    private Date FecFin = new Date();
    private ConEstadoCabecera actionSelectedGroup = new ConEstadoCabecera();
    private ConLugarAplicacion actionSelectedGroupLugarApl = new ConLugarAplicacion();
    private ConCuenta actionSelectedGroupCuenta = new ConCuenta();
    private int rowBanderaDetalle = -1;

    public void switchGroup(ConCabeceracontable cabeceraContable) {
        actionSelectedGroup = cabeceraContable.getConCodigoEstcab();

    }

    public void switchGroupLugarApl(ConDetallecontable conDetallecontable) {

        actionSelectedGroupLugarApl = conDetallecontable.getConCodigoLugapl();

    }

    public void switchGroupCuenta(ConDetallecontable conDetallecontable) {
        actionSelectedGroupCuenta = conDetallecontable.getConCodigoCue();

    }

    public ConEstadoCabecera getActionSelectedGroup() {
        return actionSelectedGroup;
    }

    public void setActionSelectedGroup(ConEstadoCabecera actionSelectedGroup) {
        this.actionSelectedGroup = actionSelectedGroup;
    }

    public ConCuenta getActionSelectedGroupCuenta() {
        return actionSelectedGroupCuenta;
    }

    public void setActionSelectedGroupCuenta(ConCuenta actionSelectedGroupCuenta) {
        this.actionSelectedGroupCuenta = actionSelectedGroupCuenta;
    }

    public ConLugarAplicacion getActionSelectedGroupLugarApl() {
        return actionSelectedGroupLugarApl;
    }

    public void setActionSelectedGroupLugarApl(ConLugarAplicacion actionSelectedGroupLugarApl) {
        this.actionSelectedGroupLugarApl = actionSelectedGroupLugarApl;
    }

    public ConTipoAsiento getTipoAsientoDefault() {
        return tipoAsientoDefault;
    }

    public void setTipoAsientoDefault(ConTipoAsiento tipoAsientoDefault) {
        this.tipoAsientoDefault = tipoAsientoDefault;
    }

    public ConCuentaManager getConCuentaManager() {
        return ConCuentaManager;
    }

    public void setConCuentaManager(ConCuentaManager ConCuentaManager) {
        this.ConCuentaManager = ConCuentaManager;
    }

    public ConEstadoCabeceraManager getConEstadoCabeceraManager() {
        return ConEstadoCabeceraManager;
    }

    public void setConEstadoCabeceraManager(ConEstadoCabeceraManager ConEstadoCabeceraManager) {
        this.ConEstadoCabeceraManager = ConEstadoCabeceraManager;
    }

    public ConLugarAplicacionManager getConLugarAplicacionManager() {
        return ConLugarAplicacionManager;
    }

    public void setConLugarAplicacionManager(ConLugarAplicacionManager ConLugarAplicacionManager) {
        this.ConLugarAplicacionManager = ConLugarAplicacionManager;
    }

    

    public List<ConDetallecontable> getListaDetalle() {
        return listaDetalle;
    }

    public void setListaDetalle(List<ConDetallecontable> listaDetalle) {
        this.listaDetalle = listaDetalle;
    }

    

    public int getRowBanderaDetalle() {
        return rowBanderaDetalle;
    }

    public void setRowBanderaDetalle(int rowBanderaDetalle) {
        this.rowBanderaDetalle = rowBanderaDetalle;
    }


    public ContabilidadTransController() throws ParseException {

        int dias = Integer.parseInt(MessagesController.obtenervariable("var_fecha_ini_default"));

        cabeceraContable = new ConCabeceracontable();
        detalleContable = new ConDetallecontable();
        listaTipoAsiento = ConTipoAsientoManager.getList();
        listaEstadoAsiento = ConEstadoCabeceraManager.getList();
        listaLugarAplicacion = ConLugarAplicacionManager.getList();
        listaCuenta = ConCuentaManager.getListOrdenado("conCodigoCue");
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DATE, -dias);
        Date date = c.getTime();
        FecInicio = date;
        listaCabecera = ConCabeceracontableManager.getList();
        listaDetalleAux = new ArrayList<ConDetallecontable>();//buscarporFecha(FecInicio,FecFin);
        nuevo(null);
    }

    public Date getFecFin() {
        return FecFin;
    }

    public void setFecFin(Date FecFin) {
        this.FecFin = FecFin;
    }

    public Date getFecInicio() {
        return FecInicio;
    }

    public void setFecInicio(Date FecInicio) {
        this.FecInicio = FecInicio;
    }

    public boolean isPanelvisible() {
        return panelvisible;
    }

    public void setPanelvisible(boolean panelvisible) {
        this.panelvisible = panelvisible;
    }

    public void llamarPanelvisible(ActionEvent event) {
        panelvisible = !panelvisible;
    }

    public List<ConCabeceracontable> getListaCabecera() {
        //ConTipoAsiento tipo=new ConTipoAsiento(tipoAsientoDefault);
        //Aqui se filtra por tipo de asiento y por  fechas

        listaCabecera = ConCabeceracontableManager.buscarporFecha(FecInicio, FecFin, tipoAsientoDefault);

        return listaCabecera;
    }

    public void setListaCabera(List<ConCabeceracontable> listaCabecera) {
        this.listaCabecera = listaCabecera;
    }
    
    public void reporte(ActionEvent actionEvent){
        try {
            Reportes reporte = new Reportes();
            String nomArchivo = "AsientoContable";
            Map parametro = new HashMap();
            parametro.put("NUM_ASIENTO", cabeceraContable.getConCodigoCabcon());
            reporte.runReporte(nomArchivo, parametro);
        } catch (Exception ex) {
            Logger.getLogger(PlanCuentasController.class.getName()).log(Level.SEVERE, null, ex);
            MessagesController.addInfo("Mensaje de error :", ex.getMessage());
            llamarPanelvisible(null);
        }
    }
    
    public void nuevo(ActionEvent actionEvent) {
        cabeceraContable = new ConCabeceracontable();
        cabeceraContable.setConFechaCabcon(FecFin);
    }

    public String eliminar() {
        try {
            cabeceraContable.setConCodigoEstcab(actionSelectedGroup);
            cabeceraContable.setConCodigoTipasi(tipoAsientoDefault);
            ConCabeceracontable cabeceraContableTemp = (ConCabeceracontable) (cabeceraContable);
            if (ConCabeceracontableManager.delete(cabeceraContableTemp) == false) {
                llamarPanelvisible(null);

            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

        return "index";

    }

    public void insertar(ActionEvent actionEvent) {
        try {
            cabeceraContable.setConCodigoCabcon(MessagesController.obtenerkeyautomatico("con_cabeceracontable", "CON_CODIGO_CABCON"));
            cabeceraContable.setConCodigoEstcab(actionSelectedGroup);
            cabeceraContable.setConCodigoTipasi(tipoAsientoDefault);
            if (ConCabeceracontableManager.create(cabeceraContable) == false) {
                llamarPanelvisible(null);
                //StaticClass.conTiposAsiento.remove(cabeceraContable);
            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

    }

    public void modificar(ActionEvent actionEvent) {
        try {
            cabeceraContable.setConCodigoEstcab(actionSelectedGroup);
            cabeceraContable.setConCodigoTipasi(tipoAsientoDefault);
            if (ConCabeceracontableManager.update(cabeceraContable) == false) {
                llamarPanelvisible(null);

            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }


    }

    public void nuevodetalle(ActionEvent actionEvent) {
        detalleContable = new ConDetallecontable();
    }

    public String eliminarDetalle() {
        try {
            int Bandera = 1;
            for (int i = 0; i < listaDetalleAux.size(); i++) {
                if (listaDetalleAux.get(i).getConCodigoDetcon() != null) {
                    //bandera que verifica si ya esta guardado el asiento para no volver hacerlo
                    Bandera = 0;

                }
            }
            if (Bandera == 0) {
                MessagesController.addInfo("Mensaje de Informacion :", "El asiento ya se encuentra guardado no se puede eliminar");
                llamarPanelvisible(null);
            } else {
                if (rowBanderaDetalle >= 0) {
                    listaDetalleAux.remove(rowBanderaDetalle);
                }
                rowBanderaDetalle = -1;
                nuevodetalle(null);
            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

        return "index";

    }

    public void insertarDetalle(ActionEvent actionEvent) {
        try {
            int Bandera = 1;
            for (int i = 0; i < listaDetalleAux.size(); i++) {
                if (listaDetalleAux.get(i).getConCodigoDetcon() != null) {
                    //bandera que verifica si ya esta guardado el asiento para no volver hacerlo
                    Bandera = 0;

                }
            }
            if (Bandera == 0) {
                MessagesController.addInfo("Mensaje de Informacion :", "El asiento ya se encuentra guardado no se puede modificar");
                llamarPanelvisible(null);
            } else {
                if (cabeceraContable.getConCodigoCabcon() != null) {
                    detalleContable.setConCodigoDetcon(null);
                    detalleContable.setConCodigoCue((ConCuenta) ConCuentaManager.getElementById(actionSelectedGroupCuenta.getConCodigoCue()));
                    detalleContable.setConCodigoLugapl((ConLugarAplicacion) ConLugarAplicacionManager.getElementById(actionSelectedGroupLugarApl.getConCodigoLugApl()));
                    detalleContable.setConCodigoCabcon(cabeceraContable);
                    if (detalleContable.getConCantidadDetcon() == null) {
                        detalleContable.setConCantidadDetcon(0.0);
                    }
                    listaDetalleAux.add(detalleContable);
                    detalleContable = new ConDetallecontable();
                } else {
                    MessagesController.addInfo("Mensaje de error :", "Se debe escojer una Cabecera");
                    llamarPanelvisible(null);
                }
            }

//            if (ConCabeceracontableManager.create(cabeceraContable) == false) {
//                llamarPanelvisible(null);
//                //StaticClass.conTiposAsiento.remove(cabeceraContable);
//            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

    }

    public void modificarDetalle(ActionEvent actionEvent) {
        try {
            if (rowBanderaDetalle >= 0) {
                detalleContable.setConCodigoCue((ConCuenta) ConCuentaManager.getElementById(actionSelectedGroupCuenta.getConCodigoCue()));
                detalleContable.setConCodigoLugapl((ConLugarAplicacion) ConLugarAplicacionManager.getElementById(actionSelectedGroupLugarApl.getConCodigoLugApl()));
                detalleContable.setConCodigoCabcon(cabeceraContable);
                listaDetalleAux.set(rowBanderaDetalle, detalleContable);
            }
            rowBanderaDetalle = -1;
            nuevodetalle(null);
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }


    }

    public void guardarDetalle(ActionEvent actionEvent) {
        try {
            Double cantidad = 0.0;
            List<String> listakey = MessagesController.obtenerlistakeyautomatico("con_detallecontable", "CON_CODIGO_DETCON", listaDetalleAux.size());
            int Bandera = 1;

            if (listaDetalleAux.size() < 1) {
                MessagesController.addInfo("Mensaje de error :", "No existe nada de guardar");
                llamarPanelvisible(null);
            } else {
                for (int i = 0; i < listaDetalleAux.size(); i++) {
                    cantidad += listaDetalleAux.get(i).getConCantidadDetcon() * Integer.parseInt(listaDetalleAux.get(i).getConCodigoLugapl().getConSignoLugApl());

                }
                if (cantidad == 0) {
                    for (int i = 0; i < listaDetalleAux.size(); i++) {
                        if (listaDetalleAux.get(i).getConCodigoDetcon() == null) {

                            listaDetalleAux.get(i).setConCodigoDetcon(listakey.get(i));
                        } else {
                            //bandera que verifica si ya esta guardado el asiento para no volver hacerlo
                            Bandera = 0;
                        }


                    }

                    if (Bandera == 0) {
                        MessagesController.addInfo("Mensaje de Informacion :", "El asiento ya se encuentra guardado no se puede modificar");
                        llamarPanelvisible(null);
                    } else {
                        if (ConDetallecontableManager.createbyListDetalle(listaDetalleAux) == false) {
                            llamarPanelvisible(null);
                            for (int i = 0; i < listaDetalleAux.size(); i++) {

                                listaDetalleAux.get(i).setConCodigoDetcon(null);

                            }
                            //StaticClass.conTiposAsiento.remove(cabeceraContable);
                        } else {
                            MessagesController.addInfo("Mensaje de Informacion :", "Asiento Guardado cuadrado");
                            llamarPanelvisible(null);
                        }
                    }

                } else {
                    MessagesController.addInfo("Mensaje de Informacion :", "Asiento no se puede guardar porque no cuadra diferencia: " + cantidad);
                    llamarPanelvisible(null);
                }

            }

        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }


    }

    public void rowSelectionListener(RowSelectorEvent event) {
        cabeceraContable = listaCabecera.get(event.getRow());
        listaDetalleAux = ConDetallecontableManager.buscarporcabecera(cabeceraContable);
        switchGroup(cabeceraContable);

    }

    public void rowSelectionListenerDetalle(RowSelectorEvent event) {
        rowBanderaDetalle = event.getRow();
        detalleContable = listaDetalleAux.get(event.getRow());
        switchGroupCuenta(detalleContable);
        switchGroupLugarApl(detalleContable);

    }

    public ConCabeceracontableManager getConCabeceracontableManager() {
        return ConCabeceracontableManager;
    }

    public void setConCabeceracontableManager(ConCabeceracontableManager ConCabeceracontableManager) {
        this.ConCabeceracontableManager = ConCabeceracontableManager;
    }

    public ConCabeceracontable getCabeceraContable() {
        return cabeceraContable;
    }

    public void setCabeceraContable(ConCabeceracontable cabeceraContable) {
        this.cabeceraContable = cabeceraContable;
    }

    public ConDetallecontable getDetalleContable() {
        return detalleContable;
    }

    public void setDetalleContable(ConDetallecontable detalleContable) {
        this.detalleContable = detalleContable;
    }

    public ConTipoAsientoManager getConTipoAsientoManager() {
        return ConTipoAsientoManager;
    }

    public void setConTipoAsientoManager(ConTipoAsientoManager ConTipoAsientoManager) {
        this.ConTipoAsientoManager = ConTipoAsientoManager;
    }

    public List<ConTipoAsiento> getListaTipoAsiento() {
        return listaTipoAsiento;
    }

    public void setListaTipoAsiento(List<ConTipoAsiento> listaTipoAsiento) {
        this.listaTipoAsiento = listaTipoAsiento;
    }

    public List<ConEstadoCabecera> getListaEstadoAsiento() {
        return listaEstadoAsiento;
    }

    public void setListaEstadoAsiento(List<ConEstadoCabecera> listaEstadoAsiento) {
        this.listaEstadoAsiento = listaEstadoAsiento;
    }

    public List<ConDetallecontable> getListaDetalleAux() {

        return listaDetalleAux;
    }

    public void setListaDetalleAux(List<ConDetallecontable> listaDetalleAux) {
        this.listaDetalleAux = listaDetalleAux;
    }

    public List<ConCuenta> getListaCuenta() {
        return listaCuenta;
    }

    public void setListaCuenta(List<ConCuenta> listaCuenta) {
        this.listaCuenta = listaCuenta;
    }

    public List<ConLugarAplicacion> getListaLugarAplicacion() {
        return listaLugarAplicacion;
    }

    public void setListaLugarAplicacion(List<ConLugarAplicacion> listaLugarAplicacion) {
        this.listaLugarAplicacion = listaLugarAplicacion;
    }    
}
